多重起動3−2EnumWindows、その他の多重起動について)
うむ、ちゃんと暖房をつけといたようだな。
部屋もあったまったところでいつものように サンプルプログラムを用意したからダウンロードしておけ
ダウンロードは出来たか?
できたなら早速サンプルプログラムを起動してみろ。
「OK!!」
一つ目を起動するとこのようなメッセージボックスが出てきたはずだ。
ではこの状態でもう一つ立ち上げてみろ。
「だめぷー」
面と向かって言われたらぶっとばしたくなるメッセージであるが、言葉から察するに
多重起動 の禁止を表しているメッセージだ。
それでは立ち上げたプログラムを2つとも終了させ、Ollydbg で読み込んでみろ。
気づいたか? そうだ、今回のサンプルプログラムは今までのサンプルプログラムとはちと違う。
これまではサンプルプログラムを Ollydbg で読みこめば全ての命令文がひと目でわかったのだが、
さすがにわかり易すぎだろう('A`) と思ったので意図的に Cコンパイラで作ったものだ。
だが API のアドレスをあーだこーだして変なポインタから呼び出したりはしていないから安心しろ。
ちなみに今までのサンプルプログラムと比べて数倍サイズが増えているが気にするな。
さて、EnumWindows の説明はもうだいじょうぶだな?
それでは CPU ウィンドウで「右クリック」⇒ 「検索」⇒「全ての外部関数呼び出し」を選択してみろ。
面倒だったら Ctrl + N でショートカットだ。
ズラズラと一覧が出てきただろう、これはプログラムが使用してる API、関数の一覧だ。
そしてこのウィンドウには検索機能がついてる。
そのままキーボードで「E」とタイプしてみるんだ。EnumWindows が選択されたはずだ。
(Ctrl + N だとアルファベットの順により先頭に EnumWindows がある)
USER32.EnumWindows
それでは EnumWindows の列が選択された状態で Enter を押してみろ。
これにより実際に EnumWindws が使われている命令文がリストされただろう。
更に Enter をすることで実際の命令文へ飛ぶことができる。
この操作も 基礎中の基礎 だからな、忘れるんじゃないぞ。
それでは実際の EnumWinows の処理を追うとするか。
まずは EnumWindows だが、前回教えたとおり 2つの引数をとっているのは分かるな?
そう、コールバック関数のポインタとコールバック関数に渡す任意の値だ。
00401080 /$ 6A 00 PUSH 0 ; /lParam = 0
00401082 |. 68 00104000 PUSH EnumWind.00401000 ; |Callback = EnumWind.00401000
00401087 |. FF15 94404000 CALL DWORD PTR DS:[<&USER32.EnumWindows>>; \EnumWindows
そしてその下には MessageBox が控えている。
MessageBox の引数を見ればわかるが、これは最初にサンプルプログラムを起動した時と同じメッセージを出すものだ。
0040108D |. 6A 00 PUSH 0 ; /Style = MB_OK|MB_APPLMODAL
0040108F |. 68 3C504000 PUSH EnumWind.0040503C ; |Title = "EnumWindows"
00401094 |. 68 48504000 PUSH EnumWind.00405048 ; |Text = "OK!!"
00401099 |. 6A 00 PUSH 0 ; |hOwner = NULL
0040109B |. FF15 9C404000 CALL DWORD PTR DS:[<&USER32.MessageBoxA>>; \MessageBoxA
004010A1 |. 33C0 XOR EAX,EAX
このことから EnumWindos ⇒ MessageBox の順で処理がされるのは理解できたが、
MessageBox の下はプログラムの終了地点をさしている。
004010A3 \. C2 1000 RETN 10
さて、ではどうするか?
EnumWindows の引数は前回説明したとおりだが、EnumWindos はデスクトップ上に存在する
トップレベルウィンドウの数だけ、コールバック関数を呼び出す。といったのは覚えているよな?
また、コールバック関数は内部に好きな処理を組み込めることも覚えているよな。
では EnumWindows の引数を参照し、コールバック関数があるアドレス:00401000へ飛んでみるぞ。
|Callback = EnumWind.00401000
任意のアドレスへ飛びたいときは Ctrl + G でウィンドウを呼び出し、アドレスを入力して Enter するだけだ。
準備はいいな?よし、飛べ!!
|